/**
 * 
 */
package com.iapcursos.portal.procefet.controle;

import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.component.UISelectOne;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.faces.validator.ValidatorException;

import com.iapcursos.portal.procefet.modelo.beans.entitys.Bairro;
import com.iapcursos.portal.procefet.modelo.beans.entitys.Endereco;
import com.iapcursos.portal.procefet.modelo.beans.entitys.Localidade;
import com.iapcursos.portal.procefet.modelo.beans.entitys.Logradouro;
import com.iapcursos.portal.procefet.modelo.beans.entitys.Papel;
import com.iapcursos.portal.procefet.modelo.beans.entitys.Pessoa;
import com.iapcursos.portal.procefet.modelo.beans.entitys.Telefone;
import com.iapcursos.portal.procefet.modelo.beans.entitys.TipoTelefone;
import com.iapcursos.portal.procefet.modelo.beans.entitys.Turma;
import com.iapcursos.portal.procefet.modelo.beans.entitys.Unidade;
import com.iapcursos.portal.procefet.modelo.beans.entitys.Usuario;
import com.iapcursos.portal.procefet.modelo.beans.sessions.interfaces.Sistema;
import com.iapcursos.portal.procefet.utils.ValidacaoRegex;

/**
 * @author gleison
 *
 */
public class NovoUsuarioPageBean {
	
	private static final String SUCESSO = "sucesso";
	
	private Pessoa pessoa;
	private String dataNascimento;
	private int dddTelRes;
	private int dddTelCelular;
	private String telCelular;
	private String telRes;
	
	private List<SelectItem> ufs;
	private List<SelectItem> turmas;
	private List<String> nomesPapeis;
	private List<String> selectedPapeis;
	private List<String> selectedTurmas;
	private List<Unidade> unidades;
	private UIInput senhaInput;
	private boolean alterar;
	
	private UISelectOne pessoa_editar;
	private static final String CADASTRAR = "cadastrar";
	
	@EJB(mappedName="sistemaBean")
	private Sistema sistema;
	/**
	 * 
	 */
	public NovoUsuarioPageBean() {
		
	}
	
	@PostConstruct
	private void init(){
		
		this.pessoa = new Pessoa();
		
		Localidade cidade = new Localidade();
		Bairro bairro = new Bairro();
		bairro.setLocalidade(cidade);
		Logradouro rua = new Logradouro();
		rua.setBairro(bairro);
		Endereco endereco = new Endereco();
		endereco.setRua(rua);		
		this.pessoa.setEndereco(endereco);
		
		Usuario usuario = new Usuario();
		usuario.setPapeis(new ArrayList<Papel>());
		this.pessoa.setUsuario(usuario);
		this.unidades = this.sistema.recuperarUnidades();
		this.popularUfs();	
		this.turmas = new ArrayList<SelectItem>();
	}
	
	private void popularUfs() {
		this.ufs = new ArrayList<SelectItem>();
		SelectItem uf;
		String[] ufs = {"RN","AC","Al","AM","AP", "BA","CE","DF","ES","GO","MA","MG","MS","MT","PA","PB"
						,"PE","PI","PR","RJ","RO","RR","RS","SC","SE","SP","TO"};
		for(int i=0; i<ufs.length; ++i){
			uf = new SelectItem(ufs[i],ufs[i]);
			this.ufs.add(uf);
		}
	}
	
	public String cadastrarUsuario(){
		
		List<Telefone> telefones = new ArrayList<Telefone>();
		
		if(!this.telCelular.equals("")){
			Telefone celular = new Telefone();
			celular.setNumero(this.telCelular.substring(2));
			celular.setDdd(Integer.parseInt(this.telCelular.substring(0,2)));
			celular.setTipo(TipoTelefone.CELULAR);
			telefones.add(celular);
		}
		
		if(!this.telRes.equals("")){
			Telefone residencial = new Telefone();
			residencial.setNumero(this.telRes.substring(2));
			residencial.setDdd(Integer.parseInt(this.telRes.substring(0,2)));
			residencial.setTipo(TipoTelefone.FIXO);
			telefones.add(residencial);	
		}		
		
		this.pessoa.setTelefones(telefones);
				
		Papel papel;				
		for(String nomePapel : this.selectedPapeis){
		
			papel = new Papel();
			papel.setLogin(this.pessoa.getUsuario().getLogin());
			papel.setNome(nomePapel);
			this.pessoa.getUsuario().getPapeis().add(papel);	
		}
		
		List<Turma> turmas = new ArrayList<Turma>();
		Turma turma;
		if(this.selectedTurmas!=null){
			for(String id : this.selectedTurmas){
				turma = this.sistema.getTurmaById(Integer.parseInt(id));
				turma.addAluno(this.pessoa);
				turmas.add(turma);
				this.sistema.atualizarTurma(turma);
			}
			this.pessoa.setTurmas(turmas);
		}
		
		if(alterar){
			this.sistema.atualizarPessoa(this.pessoa);
			alterar = false;
		}else {
			this.sistema.persistirPessoa(this.pessoa);
		}
		return SUCESSO;
	}
	
	
	
	
	private void atualizarTurmas(List<Turma> turmas){
		List<Pessoa> alunos;
		for(Turma turma : turmas){
			alunos = turma.getAlunos();
			alunos.add(this.pessoa);
			turma.setAlunos(alunos);
			//turma.addAluno(this.pessoa);
			this.sistema.atualizarTurma(turma);
		}
	}
	
	public Pessoa getPessoa() {
		return pessoa;
	}
	
	public String editarPessoa(){
		int id = Integer.parseInt(this.pessoa_editar.getValue().toString());
		this.pessoa = sistema.getPessoaById(id);
		
		for (Telefone tel : this.pessoa.getTelefones()) {
			if(tel.getTipo().equals(TipoTelefone.CELULAR)){
				this.telCelular = tel.toString();
			}else if(tel.getTipo().equals(TipoTelefone.FIXO)){
				this.telRes = tel.toString();
			}
		}
		
		this.pessoa.getUsuario().getPapeis().clear();
		
		
		alterar = true;
		return "editar";
	}
	
	public String excluirPessoa(){
		int id = Integer.parseInt(this.pessoa_editar.getValue().toString());
		this.sistema.excluirPessoa(sistema.getPessoaById(id));
		return null;
	}
	
	public String getDataNascimento() {
		return dataNascimento;
	}
	public void setDataNascimento(String dataNascimento) {
		this.dataNascimento = dataNascimento;
	}
	public int getDddTelRes() {
		return dddTelRes;
	}
	public void setDddTelRes(int dddTelRes) {
		this.dddTelRes = dddTelRes;
	}
	public int getDddTelCelular() {
		return dddTelCelular;
	}
	public void setDddTelCelular(int dddTelCelular) {
		this.dddTelCelular = dddTelCelular;
	}
	public String getTelCelular() {
		return telCelular;
	}
	public void setTelCelular(String telCelular) {
		this.telCelular = telCelular;
	}
	public String getTelRes() {
		return telRes;
	}
	public void setTelRes(String telRes) {
		this.telRes = telRes;
	}

	public List<SelectItem> getUfs() {
		return ufs;
	}

	public List<String> getNomesPapeis() {
		this.nomesPapeis = this.sistema.recuperarNomePapeis();
		return this.nomesPapeis;
	}

	public List<Unidade> getUnidades() {
		this.unidades = sistema.recuperarUnidades();
		return this.unidades;
	}

	public List<String> getSelectedTurmas() {
		return selectedTurmas;
	}

	public void setSelectedTurmas(List<String> selectedTurmas) {
		this.selectedTurmas = selectedTurmas;
	}

	public List<SelectItem> getTurmas() {
		SelectItem selTurma;
		for(Unidade unid : this.unidades){
			for(Turma turma : unid.getTurmas()){
				selTurma = new SelectItem(turma.getId(), unid.getNome()+" - "+turma.getNome());
				this.turmas.add(selTurma);
			}
		}	
		return this.turmas;
	}
	
	public void validarSenha(FacesContext context, UIComponent component, Object value)throws ValidatorException{
		String confirmaSenha = (String) value;
		String senha = (String)this.senhaInput.getLocalValue();  
		if (!confirmaSenha.equals(senha)) {  
			((UIInput)component).setValid(false);  
			FacesMessage message = new FacesMessage("Confirmação de senha não confere");  
		    context.addMessage(component.getClientId(context), message);  
		}  
	 }
	
	public void validarData(FacesContext context, UIComponent component, Object value)throws ValidatorException{
		String data = (String) value;   
		if (!ValidacaoRegex.validarData(data)){  
			((UIInput)component).setValid(false);  
			FacesMessage message = new FacesMessage("Data inválida");  
		    context.addMessage(component.getClientId(context), message);  
		}  
	 }
	
	public void validarLogin(FacesContext context, UIComponent component, Object value)throws ValidatorException{
		String login = (String) value;
		if(this.sistema.existeLogin(login)){
			((UIInput)component).setValid(false);  
			FacesMessage message = new FacesMessage("Esse nome de usário já existe. Por favor escolha outro.");  
		    context.addMessage(component.getClientId(context), message);
		}
		 
	 }
	
	public  UIInput getSenhaInput() {
		return senhaInput;
	}

	public void setSenhaInput(UIInput senhaInput) {
		this.senhaInput = senhaInput;
	}

	public final List<String> getSelectedPapeis() {
		return selectedPapeis;
	}

	public final void setSelectedPapeis(List<String> selectedPapeis) {
		this.selectedPapeis = selectedPapeis;
	}

	public UISelectOne getPessoa_editar() {
		return pessoa_editar;
	}

	public void setPessoa_editar(UISelectOne pessoa_editar) {
		this.pessoa_editar = pessoa_editar;
	}

	public boolean isAlterar() {
		return alterar;
	}

	public void setAlterar(boolean alterar) {
		this.alterar = alterar;
	}
	
	public String abrirFormCadastro(){
		this.init();
		this.alterar=false;
		return CADASTRAR;
	}
	
}
